package com.syl.starter.itools.common.utils;

import com.syl.starter.itools.base.constants.BaseConstant;
import com.syl.starter.itools.base.constants.DateConstant;

import java.util.Random;

/**
 * 随机数工具类
 *
 * @author syl
 * @create 2020-08-13 10:09
 **/
public class RandomStringUtils extends org.apache.commons.lang3.RandomStringUtils{
    /**
     * a-z A-Z加上1-9的随机数
     */
    private static final String aZ_D_RANDOM_STRING = "abcdefghijklnmopqrstuvwxyzABCDEFGHIJKLNMOPQRSTUVWXYZ123456789";

    /**
     * 获取大小写 a-z + 0-9区的随机字符串
     * @param size 随机数位数
     * @return
     */
    public static String getAzUpLowerNumber(int size) {
        return random(size, aZ_D_RANDOM_STRING);
    }

    /**
     * 获取随机订单号 默认为12位
     * @param prefix 前缀字符串
     * @return 随机订单号
     */
    public static String getOnlyOrderNumber(String prefix){
        return StringUtils.defaultString(prefix, BaseConstant.EMPTY_STRING) + getOnlyOrderNumber(4, 6, true);
    }

    /**
     * 获取随机订单号 默认为简单随机数实现
     * 前置随机数 + "M" + 格式化到秒的时间 + "R" + 后置随机数 例：1298M091128411RD23XAH
     * @param frontSize 前置随机数位数
     * @param lastSize 后置随机数位数
     * @param separator 是否加上分隔符以便区分 （M和R）
     *
     * @return 随机订单号
     */
    public static String getOnlyOrderNumber(int frontSize, int lastSize, boolean separator) {
        Random rd = new Random();
        StringBuilder n = new StringBuilder(BaseConstant.EMPTY_STRING);
        int rdGet;
        do {
            if (rd.nextInt() % 2 == 1) {
                rdGet = Math.abs(rd.nextInt()) % 10 + 48;  // 产生48到57的随机数(0-9的键位值)
            }else{
                rdGet = Math.abs(rd.nextInt()) % 26 + 97;  // 产生97到122的随机数(a-z的键位值)
            }
            char num1 = (char) rdGet;                      //int转换char
            String dd = Character.toString(num1);
            n.append(dd);
        } while (n.length() < lastSize); // 设定长度，此处假定长度小于8
        String r1= (((Math.random()*9+1)*100000) + BaseConstant.EMPTY_STRING).substring(0, frontSize);
        String time = new DateUtils().format(DateConstant.SIMPLE_TIMESTAMP);
        String orderNumber1 = r1 + time + n.toString().toUpperCase();
        String orderNumber2 = r1 + "M" + time + "R" + n.toString().toUpperCase();
        return separator ? orderNumber2 : orderNumber1;
    }

}
